const socket = require('socket.io');
const Player = require('../global/Player');
const Game = require('../global/Game');

module.exports.socket = (server) => {
  // 设置跨域处理
  const io = socket(server, { origins: '*:*', cors: true });
  // io.set('origins', '*:*');
  // console.log(io);

  io.on('connection', (Osocket) => {
    const pokers = [1, 2, 3, 4, 5, 6]
    console.log('初始化成功！下面可以用socket绑定事件和触发事件了');
    Osocket.on('send', data => {
      console.log('客户端发送的内容：', data);
      Osocket.emit('getMsg', { pokers });
    })
    // 登陆
    Osocket.on('login', name => {
      // 验证用户
      let flag = global.players.some(item => {
        return item.name === name;
      })

      if (flag) {
        console.log(`${name}:已经存在！`);
        Osocket.emit('login', { code: 1, flag: true, msg: '用户已经存在！' })
      } else {
        console.log(`${name}:登陆成功`);
        Osocket.emit('login', { code: 0, flag: false, user: { name: name }, msg: '登陆成功' })
        let player = new Player(Osocket, name) //当前玩家
        global.playerCount++; //添加在线玩家
        global.players.push(player) //
        Osocket.on('play', data => {
          // 将该玩家的状态设置为正在匹配
          player.pipei = true;
          // 一个玩家开一个定时器，以免混乱。---注意不能直接写函数体在定时器里面
          // 不然没法触发定时器停止，原因不明，踩坑两天
          player.timer = setInterval(pipei, 1000, Osocket);
        })
      }
    })

  })
}

// 过滤空闲玩家，随机返回正在匹配状态的四个玩家
function findPlayer() {
  // 过滤已经对局的玩家
  let availablePlayers = global.players.filter(item => {
    return item.state === 0 && item.pipei
  })
  if (availablePlayers.length >= 4) {
    availablePlayers.sort(function () {
      return Math.random() - 0.5; //随机排序
    });

    return availablePlayers.slice(0, 4); //随机抽取四位玩家返回
  }
  return null;
}
// 匹配
function pipei(socket) {
  let playerArr = findPlayer();  //找到正在匹配的四个玩家
  if (playerArr != null) {
    // 发送消息，提示已经匹配成功
    playerArr.forEach((item, index, arr) => {
      // 清除定时器
      item.clearTimter();
      // 加入房间 --- 优化--> 由房主命名房间号
      let room = `${arr[0].name}的房间`;
      item.joinRoom(room);
      // 开始游戏
      item.play();
    })

    let [_1, _2, _3, _4] = playerArr;
    // 可以开始对局了
    _1.Game = _2.Game = _3.Game = _4.Game = new Game(playerArr, socket); //创建房间，将四位玩家放入房间


  } else {
    // _this.socket.emit('await',{ code: 0, message: "正在匹配" })
    console.log("正在匹配...");
  }
}